#include "mutex.h"
#include <iostream>

namespace framework
{

//Semaphore===================================================
Semaphore::Semaphore(uint32_t count)
{
    //sem_init() 用来初始化一个信号量
    // 参数1：为指向信号量结构的一个指针；
    // 参数2：不为0时此信号量在进程间共享，=0时只能为当前进程的所有线程共享；
    // 参数3：给出了信号量的初始值。　
    if(sem_init(&m_semaphore, 0, count))
    {
        throw std::logic_error("sem_init error");
    }
}

Semaphore::~Semaphore()
{
    //清理信号量
    sem_destroy(&m_semaphore);
}

//获取信号量
void Semaphore::wait()
{
    //sem_wait函数的作用是给信号量的值减去一个“1”，它是一个“原子操作”
    //但它永远会先等待该信号量为一个非零值才开始做减法
    if(sem_wait(&m_semaphore))
    {
        throw std::logic_error("sem_wait error");
    }
}

//释放信号量
void Semaphore::notify()
{
    //sem_post函数也是一个原子操作，它的作用是从信号量的值加上一个“1”
    if(sem_post(&m_semaphore))
    {
        throw std::logic_error("sem_post error");
    }
}
//Semaphore===================================================

}